#导入相应的模块
import pygame
from pygame.locals import *   #导入需要的常量
import time
import random 

class HeroPlane:
	'''玩家飞机'''
	def __init__(self,screen_temp):  #要在窗口绘制飞机,故放入窗口对象
		self.x = 200
		self.y = 400   #飞机在窗口中的位置
		self.screen = screen_temp
		self.image = pygame.image.load("./images/me.png")
		self.Bullet_list = []  #用于存放玩家子弹列表

	def display(self):
		#绘制子弹
		for b in self.Bullet_list:
			b.display()
			if b.move_hero():
				self.Bullet_list.remove(b)

		'''绘制玩家飞机'''
		self.screen.blit(self.image,(self.x,self.y))  #将玩家飞机图片绑定到窗口的相应位置中

	def move_left(self):
		'''左移动飞机'''
		self.x -= 5
		#防止越界
		if self.x <= 0:
			self.x = 0

	def move_right(self):
		'''左移动飞机'''
		self.x += 5
		#防止越界	
		if self.x >= 406:
			self.x = 406

	def fire(self):
		self.Bullet_list.append(Bullet(self.screen,self.x,self.y))

class Bullet:
	'''子弹类'''
	def __init__(self,screen_temp,x,y):  #要在窗口绘制飞机,故放入窗口对象
		self.x = x+51
		self.y = y   #飞机在窗口中的位置
		self.screen = screen_temp
		self.image = pygame.image.load("./images/pd.png")

	def display(self):
		'''绘制子弹'''
		self.screen.blit(self.image,(self.x,self.y))  #将玩家飞机图片绑定到窗口的相应位置中

	def move_hero(self):
		'''子弹移动'''
		self.y -= 10
		if self.y <= -20:
			return True;

	def move_Enemy(self):
		'''敌机子弹移动'''
		self.y += 10
		if self.y >= 568:
			return True;

class EnemyPlane:
	'''敌机类'''
	def __init__(self,screen_temp):  #要在窗口绘制飞机,故放入窗口对象
		self.x = random.choice(range(408))
		self.y = -75
		self.screen = screen_temp
		self.image = pygame.image.load("./images/e2.png")
		#self.image = pygame.image.load("./images/e"+str(random.choice(range(3)))+".png")
		self.Bullet_list = []  #用于存放玩家子弹列表

	def display(self):
		#敌机在屏幕中时发射子弹	
		if self.y >=-54 and self.y < 485:
			if random.choice(range(20))==10:
				self.Bullet_list.append(Bullet(self.screen,self.x,self.y))

		#绘制子弹
		for b in self.Bullet_list:
			b.display()
			if b.move_Enemy():
				self.Bullet_list.remove(b)
		'''绘制敌机'''
		self.screen.blit(self.image,(self.x,self.y))  #将玩家飞机图片绑定到窗口的相应位置中

	def move(self,hero):
		'''敌机移动'''
		self.y += 5

		#敌机出屏幕
		if self.y >= 568:
			return True

		#遍历所有子弹	,并执行碰撞检测
		for bo in hero.Bullet_list:
			if bo.x>self.x+12 and bo.x<self.x+92 and bo.y>self.y+20 and bo.y<self.y+60:
				hero.Bullet_list.remove(bo)
				return True
	
	def kill_hero(self,hero):
		'''击中玩家飞机'''
		#遍历所有子弹	,并执行碰撞检测
		for bo in self.Bullet_list:
			if bo.x>hero.x+12 and bo.x<hero.x+92 and bo.y>hero.y+20 and bo.y<hero.y+60:
				self.Bullet_list.remove(bo)
				return True

def key_control(hero_temp):
	'''键盘控制函数'''
	#执行退出操作,不一定是按键退出
	for event in pygame.event.get():
		if event.type == QUIT:  #事件类型是不是退出指令
			print("exit()")
			exit()   #退出
	
	#获取按键信息
	pressed_keys = pygame.key.get_pressed()
	#print(pressed_keys)

	#对按键做判断,并执行对应的操作
	if pressed_keys[K_LEFT] or pressed_keys[K_a]:	
		print("Left...")
		hero_temp.move_left()
	elif pressed_keys[K_RIGHT] or pressed_keys[K_d]:
		print("Right...")
		hero_temp.move_right()	

	if pressed_keys[K_SPACE]:
		print("Space...")
		hero_temp.fire()

def key_quit():
	#执行退出操作,不一定是按键退出
	for event in pygame.event.get():
		if event.type == QUIT:  #事件类型是不是退出指令
			print("exit()")
			exit()   #退出

#游戏必须是主函数执行
def main():
	'''主程序函数'''
	#创建游戏窗口,窗口对象
	screen = pygame.display.set_mode((512,568),0,0) #窗口长宽(依据图片大小),标志,深度

	#创建游戏背景
	background = pygame.image.load("./images/bg2.jpg")

	#创建玩家飞机
	hero = HeroPlane(screen)

	#创建存放敌机列表
	enemylist = []

	flag = 1
	m = -968
	while  True:
		#绘制画面
		screen.blit(background,(0,m)) #背景位置,x=0,y=-968(568(窗口长度) - 1536(图片长度))
		m += 2
		if m>=-200:
			m = -968

		#绘制玩家飞机
		hero.display()

		#执行键盘控制
		key_control(hero)

		#随机绘制敌机
		if random.choice(range(50))==10:
			enemylist.append(EnemyPlane(screen))
		#遍历敌机并绘制移动
		for em in enemylist:
			em.display()
			if em.move(hero):
				enemylist.remove(em)
			if em.kill_hero(hero):
				image = pygame.image.load("./images/bomb.png")
				screen.blit(image,(hero.x,hero.y))
				pygame.display.update()
				time.sleep(3)
				flag = 0
				break
				

		#更新显示
		if flag == 0:
			break

		pygame.display.update()
		
		#定时显示
		#图片刷新太快,人眼分辨不出,且浪费资源,每秒24帧画面即可
		time.sleep(0.04)

	while True:
		'''Game Over'''
		key_quit()
		image = pygame.image.load("./images/timg.jpg")
		screen.blit(image,(31,100))
		pygame.display.update()	

#触发主函数执行,如果是被加载的将不会执行
#判断当前是否是主运行程序,并待用
if __name__ == "__main__":
	main()




























